/*
 * Copyright (c) 2012 SUBSECRETARIA DEFENSORIA DEL ESPACIO PUBLICO - SDEP.
 * All Rights Reserved.
 * This software is the confidential and proprietary information of SDEP
 * Developed By CONSTULT-SOFT S.A, Development Team 2012.
 *
 */
package co.gov.medellin.sdep.sisdep.domain.admin;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import co.gov.medellin.sdep.sisdep.admin.exception.PersonaException;
import co.gov.medellin.sdep.sisdep.admin.exception.PersonaRuntimeException;
import co.gov.medellin.sdep.sisdep.admin.service.IPersonaService;
import co.gov.medellin.sdep.sisdep.common.AppConstants;
import co.gov.medellin.sdep.sisdep.common.OracleHelper;
import co.gov.medellin.sdep.sisdep.domain.BaseController;
import co.gov.medellin.sdep.sisdep.domain.MessageModalWindowController;
import co.gov.medellin.sdep.sisdep.integration.mapasmedellin.BeanDireccion;
import co.gov.medellin.sdep.sisdep.integration.mapasmedellin.GeoUbicacionClient;
import co.gov.medellin.sdep.sisdep.model.Persona;

/**
 * @author Usuario
 * 
 */
public class PersonaController extends BaseController implements
		Serializable {

	/**
	 * generated serial version
	 */
	private static final long serialVersionUID = -3285110767384990403L;

	/**
	 * Constructor por defecto, inicializa los elemento basicos del Controlador
	 */
	public PersonaController() {
		personaListModel = new ListDataModel();
		cleanSearchValues();
		cleanValues();
	}

	/** bean para el manejo del formulario de busqueda Persona */
	private Persona personaSearch = new Persona();

	/** Objeto contenedor del listado de Persona luego de una consulta. */
	private transient DataModel personaListModel;

	/** bean para el manejo del formulario de creacion/edicion. Persona */
	private Persona persona = new Persona();

	/** instancia de servicio personaService */
	private IPersonaService personaService;
	
	private GeoUbicacionClient geoUbicacionClient;
	
	/** instancia un objeto de direccion local, en caso que el usuario no valide direccion al menos una vez */
	private BeanDireccion direccionLocal = new BeanDireccion();

	// --------------------------------------------------------------------
	// --- metodos para atender acciones init()
	// --------------------------------------------------------------------

	/**
	 * 
	 * @return String
	 */
	public String initState() {
		cleanSearchValues();
		cleanValues();
		return AppConstants.PERSONA_INIT_VIEW;
	}

	/**
	 * 
	 * @return String
	 */
	public String searchPersonaByKey() {
		String msg = "";		 
		try {			
			personaSearch.setIdTipoIdentificacion(new Long(personaSearch.getIdTipoIdentificacionStr()));
			List valores = null;
			valores = getPersonaService().load(1, 10,
					this.personaSearch);
			this.personaListModel.setWrappedData(valores);
		} catch (Exception e) {
			msg = e.getMessage();
			e.printStackTrace(System.err);
		}
		if (this.personaListModel.getWrappedData() == null) {
			if(msg.equals("")){
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		} else {
			if (((List) this.personaListModel.getWrappedData()).isEmpty()) {
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		}
		cleanSearchValues();
		((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setSuccessMessage(msg, null, null);
		return AppConstants.PERSONA_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String create() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {			
			if (this.persona.getId().longValue() == 0L) {
				persona.setIdTipoPersona(new Long(persona.getIdTipoPersonaStr()));
				persona.setIdTipoIdentificacion(new Long(persona.getIdTipoIdentificacionStr()));
				persona.setIdEstrato(new Long(persona.getIdEstratoStr()));
				persona.setIdSexo(new Long(persona.getIdSexoStr()));
				persona.setIdEscolaridad(new Long(persona.getIdEscolaridadStr()));
				persona.setEdad(new Long(persona.getEdadStr()));
				persona.setIdEstadoCivil(new Long(persona.getIdEstadoCivilStr()));
				
				//checkAddress();
				persona.setCodigoBarrio(OracleHelper.isNullorEmpty(direccionLocal.getCodBarrio()) ? "N/A" : direccionLocal.getCodBarrio());
				persona.setBarrio(OracleHelper.isNullorEmpty(direccionLocal.getValueNomBarrio()) ? "NO Disponible" : direccionLocal.getValueNomBarrio());
				persona.setCodigoComuna(OracleHelper.isNullorEmpty(direccionLocal.getCodComuna()) ? "N/A" : direccionLocal.getCodComuna());
				persona.setComuna(OracleHelper.isNullorEmpty(direccionLocal.getValueNomComuna()) ? "NO Disponible" : direccionLocal.getValueNomComuna());
				
				getPersonaService().insert(this.persona);
				msg = AppConstants.SUCCESS_CREATE;
			}
		} catch (PersonaException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (PersonaRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		cleanValues();
		((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setSuccessMessage("- Persona " + msg, null, null);
		return AppConstants.PERSONA_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String update() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.persona.getId().longValue() != 0L) {				
				persona.setIdTipoPersona(new Long(persona.getIdTipoPersonaStr()));
				persona.setIdTipoIdentificacion(new Long(persona.getIdTipoIdentificacionStr()));
				persona.setIdEstrato(new Long(persona.getIdEstratoStr()));
				persona.setIdSexo(new Long(persona.getIdSexoStr()));
				persona.setIdEscolaridad(new Long(persona.getIdEscolaridadStr()));
				persona.setEdad(new Long(persona.getEdadStr()));
				persona.setIdEstadoCivil(new Long(persona.getIdEstadoCivilStr()));
				
				//checkAddress();
				persona.setCodigoBarrio(OracleHelper.isNullorEmpty(direccionLocal.getCodBarrio()) ? "N/A" : direccionLocal.getCodBarrio());
				persona.setBarrio(OracleHelper.isNullorEmpty(direccionLocal.getValueNomBarrio()) ? "NO Disponible" : direccionLocal.getValueNomBarrio());
				persona.setCodigoComuna(OracleHelper.isNullorEmpty(direccionLocal.getCodComuna()) ? "N/A" : direccionLocal.getCodComuna());
				persona.setComuna(OracleHelper.isNullorEmpty(direccionLocal.getValueNomComuna()) ? "NO Disponible" : direccionLocal.getValueNomComuna());
				
				getPersonaService().update(this.persona);
				
				msg = AppConstants.SUCCESS_UPDATE;
			}
		} catch (PersonaException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (PersonaRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		cleanValues();
		((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setSuccessMessage("- Persona " + msg, null, null);
		return AppConstants.PERSONA_SEARCH_VIEW;
	}

	// --------------------------------------------------------------------
	// --- metodos para atender acciones end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public String createPersona() {
		//persona = new Persona();
		cleanValues();		
		return AppConstants.PERSONA_CREATE_VIEW;
	}

	public String checkAddress() {
		direccionLocal = getGeoUbicacionClient().getAddressLocalization(this.persona.getDireccionResidencia());
		if(null == direccionLocal) {
			direccionLocal = new BeanDireccion();
		}
		persona.setCodigoBarrio(OracleHelper.isNullorEmpty(direccionLocal.getCodBarrio()) ? "N/A" : direccionLocal.getCodBarrio());
		persona.setBarrio(OracleHelper.isNullorEmpty(direccionLocal.getValueNomBarrio()) ? "NO Disponible" : direccionLocal.getValueNomBarrio());
		persona.setCodigoComuna(OracleHelper.isNullorEmpty(direccionLocal.getCodComuna()) ? "N/A" : direccionLocal.getCodComuna());
		persona.setComuna(OracleHelper.isNullorEmpty(direccionLocal.getValueNomComuna()) ? "NO Disponible" : direccionLocal.getValueNomComuna());

		return "";
	}
	/**
	 * 
	 * @return
	 */
	public String updatePersona() {
		Map params = getExternalContext().getRequestParameterMap();
		String personaDataIndex = (String) params.get("personaDataIndex");
		this.persona = (Persona) ((List) this.personaListModel.getWrappedData()).get(Integer.parseInt(personaDataIndex));
		
		persona.setIdTipoPersonaStr(persona.getIdTipoPersona().toString());
		persona.setIdTipoIdentificacionStr(persona.getIdTipoIdentificacion().toString());
		persona.setIdEstratoStr(persona.getIdEstrato().toString());
		persona.setIdSexoStr(persona.getIdSexo().toString());
		persona.setIdEscolaridadStr(persona.getIdEscolaridad().toString());
		persona.setEdadStr(persona.getEdad().toString());
		persona.setIdEstadoCivilStr(persona.getIdEstadoCivil().toString());
		
		cleanSearchValues();
		return AppConstants.PERSONA_UPDATE_VIEW;
	}

	/**
	 *
	 * @return
	 */
	public String cancelPersona() {
		cleanSearchValues();
		return AppConstants.PERSONA_SEARCH_VIEW;
	}

	/**
	 *
	 * @return
	 */
	public String cancelPersonaOpcion() {
		cleanValues();
		cleanSearchValues();
		return AppConstants.PERSONA_MENU_VIEW;
	}

	/**
	 * limpia el contenido de los valores que se ingresan para buscar
	 */
	public final void cleanSearchValues() {
		personaSearch.setIdentificacion("");
		personaSearch.setIdTipoIdentificacion(new Long(0));
		
		((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.clearMessage();
	}

	/**
	 * limpia el contenido de los valores que se ingresan (Create, Update)
	 */
	public final void cleanValues() {
		persona.setId(new Long(0L));
		persona.setIdentificacion("");
		persona.setIdTipoPersonaStr("");
		persona.setIdTipoIdentificacion(new Long(0));
		persona.setPrimerNombre("");
		persona.setSegundoNombre("");
		persona.setPrimerApellido("");
		persona.setSegundoApellido("");
		persona.setTelefonoResidencia("");
		persona.setTelefonoFamiliar("");
		persona.setTelefonoConocido("");
		persona.setNumeroCelular("");
		persona.setDireccionResidencia("");
		persona.setCodigoBarrio("");
		persona.setBarrio("");
		persona.setCodigoComuna("");
		persona.setComuna("");
		persona.setIdEstrato(new Long(0L));
		persona.setIdSexo(new Long(0L));
		persona.setIdEscolaridad(new Long(0L));
		persona.setEmail("");
		persona.setDepartamento("");
		persona.setMunicipio("");
		persona.setLugarNacimiento("");
		persona.setEdad(new Long(0L));
		persona.setIdEstadoCivil(new Long(0L));
		persona.setFechaNacimiento(null);
		persona.setEstado("");
		persona.setIdTipoIdentificacionStr("0");
		persona.setIdEstratoStr("0");
		persona.setIdSexoStr("0");
		persona.setIdEscolaridadStr("0");
		persona.setEdadStr("0");
		persona.setIdEstadoCivilStr("0");
		persona.setMotivoRegistro("");
		
		if(this.personaListModel.getWrappedData() != null) {
			((List)this.personaListModel.getWrappedData()).clear();
		}		
	}

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- getters and setters init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public Persona getPersonaSearch() {
		return personaSearch;
	}

	/**
	 * 
	 * @param personaSearch
	 */
	public void setpersonaSearch(Persona personaSearch) {
		this.personaSearch = personaSearch;
	}

	/**
	 * 
	 * @return
	 */
	public DataModel getpersonaListModel() {
		return personaListModel;
	}

	/**
	 * 
	 * @param personaListModel
	 */
	public void setpersonaListModel(DataModel personaListModel) {
		this.personaListModel = personaListModel;
	}

	/**
	 * 
	 * @return
	 */
	public Persona getPersona() {
		return persona;
	}

	/**
	 * 
	 * @param persona
	 */
	public void setpersona(Persona persona) {
		this.persona = persona;
	}

	/**
	 * obtencion del servicio personaService
	 * 
	 * @return
	 */
	public IPersonaService getPersonaService() {
		return personaService;
	}

	/**
	 * establecimiento del servicio personaService, la inyeccion de la
	 * dependencia la cubre SpringFramework
	 * 
	 * @param personaService
	 */
	public void setPersonaService(
			IPersonaService personaService) {
		this.personaService = personaService;
	}

	// --------------------------------------------------------------------
	// --- getters and setters end()
	// --------------------------------------------------------------------

	/**
	 * @return
	 */
	public GeoUbicacionClient getGeoUbicacionClient() {
		return geoUbicacionClient;
	}

	/**
	 * @param client
	 */
	public void setGeoUbicacionClient(GeoUbicacionClient client) {
		geoUbicacionClient = client;
	}

}
